#ifndef TASKWRAPPER_H
#define TASKWRAPPER_H

#include <QObject>
#include <QDebug>
#include <QMutex>
#include <Task/ScanApi.h>
#include <Task/AsyncRunner.h>
#include <Database/AnalysisSql.h>
#include <QDir>
#include <QCoreApplication>

/**
 * @brief The TaskWrapper class
 *
 * 此文件为需要注册到qml引擎的ui接口, 完成周期触发处理图像的逻辑
 *
 * 注册到引擎的方式采用单例
 *
 * 全流程执行如下:
 *  1. 判断当前是否正在执行流程，如果正在执行，周期函数弹出
 *  2. 设置状态值为正在执行
 *  3. 使用ScanApi获取下一个需要执行的对象
 *  4. 写入需要执行的对象信息到数据库
 *  5. 使用AsyncRunner创建需要执行计算的线程对象
 *  6. 消费远程文件
 *  7. 释放状态
 *  8. 执行完成后写入状态到数据库
 *  9. 触发完成信号，ui触发相关更新逻辑
 */

static QMutex staticMutex;


class TaskWrapper : public QObject
{
    Q_OBJECT

public:
    explicit TaskWrapper(QObject *parent = nullptr);

    // ui周期调用的此函数示例，注意删除
    Q_INVOKABLE void exampleLoop();
    Q_INVOKABLE void nextTaskStart();

private:
    void _nextTaskStart();
    // 获取远程配置表初始化全局文件路径
    ScanApiResult::RemoteScanApiResult taskInitScanModule();
    // 获取下一个文件对象
    ScanApiResult::RemoteScanApiCacheResult taskGetNextFileObj();
    // 创建Runner
    void taskCreateRunnerAndStart();
    // 消费
    ScanApiResult::RemoteScanApiResult taskConsumeFileObj();
    // 其他数据库相关

private slots:
    // 线程回调
    void AsyncRunningDone(const AsyncRunnerResult res);


signals:
    void taskRunningDone(QString filename, QString errMsg);

private:
    bool hasTaskRunning;
    AsyncRunner *runPtr;
    ScanApiResult::RemoteScanApiCacheResult nowFile;
    SqlDomain::AnalysisDomain nowSql;
    AnalysisSql *sqlPtr;
};

#endif // TASKWRAPPER_H
